<?php

class objr_processor extends sharpobj_processor
{
	// **********************************************
    // Работа с объектами

    /**
     * Получить id объекта (если необходимо, создать новый)
     */
    protected function act_saveObject(sharpobj_data_interface_item $obj)
    {
        $id = $this->storageLink('objects')->sqlqueryOneValue(
						"SELECT #!id# FROM #!table# "
						." WHERE `class_id`='{$obj->get('sql','class_id')}'"
						." AND `ext_id`='{$obj->get('sql','ext_id')}'");
        if ($id)
        {
            return (int) $id;
            
        }
        return $this->storageLink('objects')->insert($obj); 
    }
	/**
     * Получить id объекта (если необходимо, создать новый)
     */
    protected function act_getObject(sharpobj_data_interface_item $obj)
    {
        return $this->storageLink('objects')->sqlqueryGet(
						" WHERE `class_id`='{$obj->get('sql','class_id')}'"
						." AND `ext_id`='{$obj->get('sql','ext_id')}'"); 
    }
    
    /**
     * Удалить побъект и все упоминания о нем
     */
    protected function act_deleteObject($id)
    {
        // Удаляем упоминания об объекте из access
        if (function_exists('access_delete_item'))
        {
            access_delete_item('obj',sharpobj_conv_obj_int($id));
        }
        
        // Удаляем объект
        return $this->storageLink('objects')->delete($id); 
    }
    
    // **********************************************
    // Работа с классами объектов

    /**
     * Получить id класса (если необходимо, создать новый)
     */
    protected function act_saveClass(sharpobj_data_interface_item $obj)
    {
        $id = $this->storageLink('classes')->sqlqueryOneValue(
						"SELECT #!id# FROM #!table# "
						." WHERE `mod`='{$obj->get('sql','mod')}'"
						." AND `code`='{$obj->get('sql','code')}'");
        if ($id)
        {
            return (int) $id;
            
        }
        return $this->storageLink('classes')->insert($obj); 
    }
 /**
     * Удалить побъект и все упоминания о нем
     */
    protected function act_deleteClass($id)
    {
        if (!$id)
        {
            return false;
        }
        $id = sharpobj_conv_obj_int($id);
        // Удаляем упоминания из access
        if (function_exists('access_delete_item'))
        {
            // Удаляем все права для категории
            access_delete_item('obj_class',$id);
        }
        // Удаляем категории класса
        $list = $this->act_listClassCateg($id);
        foreach ($list as $obj)
        {
            $this->act_deleteCategory($obj->getId());
        }
        unset($list);
        // Удаляем объекты класса
        $list = $this->act_listClassObj($id);
        foreach ($list as $obj)
        {
            $this->act_deleteObject($obj->getId());
        }
        
        // Удаляем категорию
        return $this->storageLink('classes')->delete($id); 
    }
    /**
     * Получить список объектов в категории
     */
    protected function act_listClassObj($id)
    {
        // Удаляем категорию
        return $this->storageLink('objects')->getListFilter(array('class_id'=>sharpobj_conv_obj_int($id))); 
    }
    /**
     * Получить список объектов в категории
     */
    protected function act_listClassCateg($id)
    {
        // Удаляем категорию
        return $this->storageLink('categories')->getListFilter(array('class_id'=>sharpobj_conv_obj_int($id))); 
    }
    
    // **********************************************
    // Работа с категориями объектов
    
    /**
     * Получить id категории (если необходимо, создать новую)
     */
    protected function act_saveCategory(sharpobj_data_interface_item $obj)
    {
        $id = $this->storageLink('categories')->sqlqueryOneValue(
						"SELECT #!id# FROM #!table# "
						." WHERE `class_id`='{$obj->get('sql','class_id')}'"
						." AND `code`='{$obj->get('sql','code')}'");
        if ($id)
        {
            return (int) $id;
            
        }
        return $this->storageLink('categories')->insert($obj); 
    }
    /**
     * Удалить объект и все упоминания о нем
     */
    protected function act_deleteCategory($id)
    {
        if (!$id)
        {
            return false;
        }
        $id = sharpobj_conv_obj_int($id);
        // Удаляем упоминания из access
        if (function_exists('access_delete_item'))
        {
            // Удаляем все права для категории
            access_delete_item('obj_category',$id);
        }
        $list = $this->act_listCategoryObj($id);
        foreach ($list as $obj)
        {
            $this->act_deleteObject($obj->getId());
        }
        
        // Удаляем категорию
        return $this->storageLink('categories')->delete($id); 
    }
    /**
     * Получить список объектов в категории
     */
    protected function act_listCategoryObj($id)
    {
        // Удаляем категорию
        return $this->storageLink('objects')->getListFilter(array('category_id'=>sharpobj_conv_obj_int($id))); 
    }
    
    // **********************************************
    // Описание структуры
    // **********************************************
    function __construct()
    {
        // Создаем справочники
        // Задаем формат справочников


        // Объявляем формат
        $format_obj = new sharpobj_storage_format();
        $format_obj->addItem('class_id','class_id','int');
        $format_obj->addItem('category_id','category_id','int');
        $format_obj->addItem('ext_id','ext_id','int');

        // Объявляем справочник
        $this->storageAdd
                        (
							'objects', 
                            new sharpobj_storage_mysql
                            (
                                $format_obj,
                                array(
										'tbname'=>'objr_objects',
										'idfield'=>'id'
                                      )
                            )
                        );
                        
        // Объявляем формат
        $format_class = new sharpobj_storage_format();
        $format_class->addItem('code','code','smallatword',array('len_max'=>50));
        $format_class->addItem('mod','mod','smallatword',array('len_max'=>50));
        $format_class->addItem('name','name','row',array('len_max'=>250));

        // Объявляем справочник
        $this->storageAdd
                        (
							'classes', 
                            new sharpobj_storage_mysql
                            (
                                $format_class,
                                array(
										'tbname'=>'objr_classes',
										'idfield'=>'id'
                                      )
                            )
                        );
                        
        // Объявляем формат
        $format_category = new sharpobj_storage_format();
        $format_category->addItem('class_id','class_id','int');
        $format_category->addItem('code','code','smallatword',array('len_max'=>50));
        $format_category->addItem('name','name','row',array('len_max'=>250));

        // Объявляем справочник
        $this->storageAdd
                        (
							'categories', 
                            new sharpobj_storage_mysql
                            (
                                $format_category,
                                array(
										'tbname'=>'objr_categories',
										'idfield'=>'id'
                                      )
                            )
                        );
/*
        // Объявляем формат
        $format_assoc = new sharpobj_storage_format();
        $format_assoc->addItem('obj1_id','obj1_id','int');
        $format_assoc->addItem('obj2_id','obj2_id','int');

        // Объявляем справочник
        $this->storageAdd
                        (
							'assoc', 
                            new sharpobj_storage_mysql
                            (
                                $format_assoc,
                                array(
										'tbname'=>'objr_assoc',
										'idfield'=>'id'
                                      )
                            )
                        );
*/
        // *******************************************************
        // Форматы объектов
                        
    }

    // Исталляция
    protected function act_createTables()
    {
        //
        $this->storageLink('objects')->sqlqueryAction("
CREATE TABLE #!table#  (
`id` INT NOT NULL AUTO_INCREMENT,
`class_id` INT NOT NULL COMMENT 'id типа объекта',
`category_id` INT default NULL COMMENT 'id категории объекта',
`ext_id` INT NOT NULL COMMENT 'id объекта в исходной таблице',
PRIMARY KEY  (`id`),
KEY ( `class_id` ),
KEY ( `category_id` ),
UNIQUE KEY `external_obj` (`ext_id`,`class_id`)
) ENGINE = MYISAM COMMENT = 'Реестр объектов';");
        $this->storageLink('classes')->sqlqueryAction("
CREATE TABLE #!table# (
  `id` int(11) NOT NULL auto_increment,
  `code` varchar(100) collate utf8_unicode_ci NOT NULL COMMENT 'код класса',
  `mod` varchar(100) collate utf8_unicode_ci NOT NULL COMMENT 'модуль класса',
  `name` varchar(255) collate utf8_unicode_ci default NULL COMMENT 'Читаемое название класса',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `codemod` (`mod`,`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Классы объектов';");
        
        $this->storageLink('categories')->sqlqueryAction("
CREATE TABLE #!table# (
  `id` int(11) NOT NULL auto_increment,
  `class_id` INT NOT NULL COMMENT 'id типа объекта',
  `code` varchar(100) collate utf8_unicode_ci NOT NULL COMMENT 'код категории',
  `name` varchar(255) collate utf8_unicode_ci default NULL COMMENT 'Читаемое название категории',
  PRIMARY KEY  (`id`),
  KEY ( `code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Классы объектов';");
        
        /*
        $this->storageLink('assoc')->sqlqueryAction("
CREATE TABLE #!table# (
  `id` int(11) NOT NULL auto_increment,
  `obj1_id` INT NOT NULL COMMENT 'id первого объекта',
  `obj2_id` INT NOT NULL COMMENT 'id второго объекта',
  PRIMARY KEY  (`id`),
  KEY ( `obj1_id`),
  KEY ( `obj2_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Ассоциации объектов';");
	*/
    }

    protected function act_dropTables()
    {
        //
        $this->storageLink('objects')->sqlqueryAction("DROP TABLE #!table#;");
        $this->storageLink('classes')->sqlqueryAction("DROP TABLE #!table#;");
        $this->storageLink('categories')->sqlqueryAction("DROP TABLE #!table#;");
        // $this->storageLink('assoc')->sqlqueryAction("DROP TABLE #!table#;");

    }
    
   
}


?>